#include " tree.h"

// 初始化二叉树
Tree_Node *init_binary_tree(Elenemt_data data)
{
    // 如果根节点为空，则创建新节点作为根节点
    Tree_Node *new_node = (Tree_Node *)malloc(sizeof(Tree_Node));
    if (new_node == NULL)
    {
        printf("创建失败\n");
        return NULL;
    }
    // 将数据复制到新节点的数据域中
    new_node->data = data;
    new_node->lchilb = NULL;
    new_node->rchilb = NULL;
    return new_node;
}

// 插入节点
void insert_node(Tree_Node **root, Elenemt_data data)
{
    if (*root == NULL)
    {
        // 如果根节点为空，则创建新节点作为根节点
        Tree_Node *new_node = (Tree_Node *)malloc(sizeof(Tree_Node));
        if (new_node == NULL)
        {
            printf("创建失败\n");
            return;
        }
        // 将数据复制到新节点的数据域中
        new_node->data = data;
        new_node->lchilb = NULL;
        new_node->rchilb = NULL;
        *root = new_node; // 将新节点作为根节点
        printf("插入成功\n");
        return;
    }

    if (data.id <= (*root)->data.id)
    {
        // 小 或者 等于 调用 左结点
        insert_node(&(*root)->lchilb, data);
    }
    else
    {
        // 大 调用 右结点
        insert_node(&(*root)->rchilb, data);
    }
    return;
}

// 先序遍历 根 左 右   pre_rder
void pre_rder(Tree_Node *root)
{
    if (root != NULL)
    {
        // 打印当前节点的数据
        printf("姓名: %s, 性别: %s, 年龄: %d, 学号: %d, 成绩: %d\n",
               root->data.name, root->data.sex, root->data.age, root->data.id, root->data.sco);
        // 递归遍历左子树
        pre_rder(root->lchilb);
        // 递归遍历右子树
        pre_rder(root->rchilb);
    }
}

// 中序遍历 左 根 右    ino_rder
void ino_rder(Tree_Node *root)
{
    if (root != NULL)
    {
        // 递归遍历左子树
        ino_rder(root->lchilb);
        // 打印当前节点的数据
        printf("姓名: %s, 性别: %s, 年龄: %d, 学号: %d, 成绩: %d\n",
               root->data.name, root->data.sex, root->data.age, root->data.id, root->data.sco);
        // 递归遍历右子树
        ino_rder(root->rchilb);
    }
}

// 后序遍历 左 右 根   pos_rder
void pos_rder(Tree_Node *root)
{
    if (root != NULL)
    {
        // 递归遍历左子树
        pos_rder(root->lchilb);
        // 递归遍历右子树
        pos_rder(root->rchilb);
        // 打印当前节点的数据
        printf("姓名: %s, 性别: %s, 年龄: %d, 学号: %d, 成绩: %d\n",
               root->data.name, root->data.sex, root->data.age, root->data.id, root->data.sco);

    }
}